ORG     0x7c00;//程序启动地址

section .text 
;;//注意不要随意加 section ，要用times db 留空间，不能打乱，打乱后($-$$)只在当前段
;section 
		JMP _init ;//跳转到起始代码，后面一块被分区表占了
	
		;//不同分区格式的分区结束位置不一样
		;FAT12 和 FAT16 0x3e
		;NTFS 0x54
		;FAT32 0x5a
		;exFat 0x78
		;30天开发操作系统的作者选取的数据是0x50，启动软盘是FAT12格式
		;如果你扣的话用
		;times 0x3e-($-$$) db 0x00 ;FAT12 或者FAT16安全
		times 0x78-($-$$) db 0x00;用这个通吃任何分区格式，浪费最多58个字节而已，反正这个启动代码的逻辑只是用来搞出下一步
		
_init: ;初始化寄存器
		MOV		AX,0		;MOV指令搬运值，AX=0  AX常用寄存器，相对通用
		MOV		SS,AX		;SS=AX
		MOV		SP,$$ 		;SP = 0x7c00   $$是NASM标记，表式当前段的起始地址
		MOV		DS,AX		;DS=AX
		MOV		ES,AX		;ES=AX
		 
_start: ;真正有意义的代码  		
		MOV		SI,msg		;SI=msg
putloop:
		MOV		AL,[SI]		;AL = *SI  []的意思就是把SI作为地址，取这个内存位置的值，所有用到地址的时候默认地址都是
		;AL,[DS:SI]  从DS段读取

		ADD		SI,1			; 给SI加1	SI++
		CMP		AL,0			; CMP 指令有隐藏的输出 Flags.ZF 会变成1
		JE		fin				; JE指令有隐藏的输入 if(Flags.ZF==1) JMP
		MOV		AH,0x0e			; 显示一个文字
		MOV		BX,15			; 指定字符颜色
		INT		0x10			; 调用显卡BIOS	INT隐藏的输入输出众多，根据调用的功能不同差距很大，前面的这些都是他的输入
			;INT10 输出文字使用四个输入 BH =0 AH =0x0e AL =字符 BX =颜色  显示文字
		JMP		putloop
fin:
		HLT						; 让CPU停止，等待指令 sleep
		JMP		fin				; 无限循环

msg:
	db	'Hello, world! clear version.',0x0a	;our dear string
